package com.fqy.ticket.common.controller;


// 验证发现NotNull抛出的是MethodArgumentNotValidException不是BindException
// @RestControllerAdvice
// public class ControllerExceptionHandler {
//     private static final Logger LOG = LoggerFactory.getLogger(ControllerExceptionHandler.class);
//     /**
//      * 捕获 @RequestBody + @Valid 校验失败的异常
//      */
//     @ExceptionHandler(Exception.class)
//     public CommonResp<Object> handleAllExceptions(Exception ex) {
//         // 打印异常的类名和消息
//         LOG.error("捕获到异常类型：{}，异常消息：{}", ex.getClass().getName(), ex.getMessage());
//
//         // 根据异常类型返回不同响应（可选）
//         if (ex instanceof MethodArgumentNotValidException) {
//             LOG.info("1");
//             return null;
//         } else if (ex instanceof BindException) {
//             LOG.info("2");
//             return null;
//         } else {
//             return null;
//         }
//     }
// }

import com.fqy.ticket.common.exception.BusinessException;
import com.fqy.ticket.common.resp.CommonResp;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 统一异常处理、数据预处理等
 */
@ControllerAdvice
public class ControllerExceptionHandler {

    private static final Logger LOG = LoggerFactory.getLogger(ControllerExceptionHandler.class);

    /**
     * 所有异常统一处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public CommonResp<Object> exceptionHandler(Exception e) throws Exception {
        // LOG.info("seata全局事务ID: {}", RootContext.getXID());
        // 如果是在一次全局事务里出异常了，就不要包装返回值，将异常抛给调用方，让调用方回滚事务
        // if (StrUtil.isNotBlank(RootContext.getXID())) {
        //     throw e;
        // }
        CommonResp<Object> commonResp = new CommonResp<>();
        LOG.error("系统异常：", e);
        commonResp.setSuccess(false);
        commonResp.setMessage("系统出现异常，请联系管理员");
        return commonResp;
    }

    /**
     * 业务异常统一处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = BusinessException.class)
    @ResponseBody
    public CommonResp<Object> exceptionHandler(BusinessException e) {
        CommonResp<Object> commonResp = new CommonResp<>();
        // LOG.error("业务异常：{}", e.getAnEnum().getDesc());
        // LOG.error("业务异常：{}", e);
        LOG.error("业务异常：{}", e.getAnEnum().getDesc());
        commonResp.setSuccess(false);
        commonResp.setMessage(e.getAnEnum().getDesc());
        return commonResp;
    }

    /**
     * 校验异常统一处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = BindException.class)
    @ResponseBody
    public CommonResp<Object> exceptionHandler(BindException e) {
        CommonResp<Object> commonResp = new CommonResp<>();
        LOG.error("绑定异常：{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        // LOG.error("校验异常：{}", e.getMessage());
        commonResp.setSuccess(false);
        // commonResp.setMessage(e.getMessage());
        commonResp.setMessage(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        return commonResp;
    }

    /**
     * 校验异常统一处理 - 处理JSON参数校验失败（MethodArgumentNotValidException）
     * @param e
     * @return
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    public CommonResp<Object> exceptionHandler(MethodArgumentNotValidException e) {
        CommonResp<Object> commonResp = new CommonResp<>();
        LOG.error("校验异常：{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        commonResp.setSuccess(false);
        commonResp.setMessage(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        return commonResp;
    }

    /**
     * 校验异常统一处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = RuntimeException.class)
    @ResponseBody
    public CommonResp<Object> exceptionHandler(RuntimeException e) {
        throw e;
    }

}

